\chapter{Структура enterprise-приложения}

Приложение в целом реализует идею MVC и имеет трёхзвенную архитектуру. Общая идея его строения показана на рисунке \ref{pic:architecture}.

\begin{figure}[h]
  \centering
  \includegraphics[width=\linewidth]{resources/architecture}
  \caption{Архитектура приложения}
  \label{pic:architecture}
\end{figure}

При написании программы использовалась спецификация Java EE 5. В настоящее время она поддерживается большинством серверов приложений.

Приложение запускается на сервере приложений JBoss 5.1.0.GA (это последняя версия на текущий момент). Выбор сервера приложений вызван следующими причинами:
\begin{itemize}
\item это бесплатное ПО;
\item это приложение с открытым исходным кодом;
\item это кросплатформенное приложение;
\item хорошая реализация Java EE;
\item логичная стуктура каталогов;
\item простота настройки.
\end{itemize}

На сервере приложений выполняется основная логика приложения, осуществляется доступ к данным. Этот же сервер играет роль веб-сервера и предоставляет конечному пользователю доступ к веб-интерфейсу приложения.

\section{Слой данных}

Для хранения данных в проекте используется СУБД PostgreSQL 8.4.3. Это тоже последняя версия на текущий момент. Она вышла 15 марта 2010 года. Выбор именно этой СУБД обусловлен следующими причинами:
\begin{itemize}
\item это свободное ПО;
\item реализации существуют почти под все операционные системы, что обеспечивает кросплатформенность нашего приложения;
\item поддержка баз почти неограниченного размера;
\item простота настройки и адаптации;
\item надёжность работы;
\item наличие свободного JDBC-драйвера.
\end{itemize}

Сервер приложений взаимодействует с базой, используя JDBC-драйвер, но это происходит неявно с точки зрения программиста, потому что при написании приложения использовалась технология Entity Persistence. Иными словами, в приложении имеются некоторые классы, описывающие сущности из базы и проаннотированные специальным образом. Их можно использовать как обыные объекты, что позволяет прозрачно получать доступ к базе и обеспечивает поддержку кросплатформенности приложения, т.~е. при желании можно безболезненно сменить СУБД на любую другую, не переписывая программный код. Концептуальное представление архитектуры слоя данных показано на рисунке \ref{pic:data_layer}.

\begin{figure}[h]
  \centering
  \includegraphics[width=\linewidth]{resources/data_layer}
  \caption{Слой данных}
  \label{pic:data_layer}
\end{figure}

Учитвая EAV модель (подробно см. раздел \ref{chap:db}), следует заметить, что работа с данными в силу своей гибкости довольно нетривиальна. Сущности вроде <<Атрибут>> и <<Параметр>> действительно доступны для работы, их легко создавать, удалять и изменять, но работать с конечными сущностями вроде <<Студент>> и <<Зачёт по математическому моделированию>> становится довольно сложно.

\section{Бизнес-слой}

Бизнес-слой в учебном проекте представлен сессионными бинами, предоставляющими доступ к данным. Ясно, что в реальной системе он был бы гораздо сложней. Сессионные бины используют Entity Manager для получения данных, их изменения и сохраненния, а также для выполнения параметризованных запросов. Они предоставляют доступ пользователю системы. В реальном проекте здесь была бы ещё система безопасности. Идея описанного взаимодействия схематично представлена на рисунке \ref{pic:business_layer} 

\begin{figure}[h]
  \centering
  \includegraphics[width=\linewidth]{resources/business_layer}
  \caption{Бизнес-слой}
  \label{pic:business_layer}
\end{figure}

В проекте реализованы сессионные бины без состояния, входящие в спецификацию EJB 3.0. Это позволяет не писать сложных дескрипторов развёртывания, а просто проаннотировать классы и интерфейсы бинов специальным образом.

\section{Веб-слой}

Веб-слой работает на том же сервере приложений, что и бизнес-слой. Нужно отметить, что интерфейсы сессионных бинов локальные (отчасти в целях безопасности), так что иной вариант в данном программном продукте не поддерживается.

Веб-слой выполнен на технологии JSF 1.2, поддерживаемой в полном объёме большинством серверов приложений. Иными словами, имеется некий фасадный сервлет (реализованный сервером приложений), на который перенаправляются все запросы пользователя. Этот сервлет проводит обработку запроса, разрешает URL, подгружает нужную JSP-страницу, выполняет вычисления её контекста (в том числе отложенные) и возвращает пользователю отклик. Общая схема веб-слоя изображена на рисунке \ref{pic:web_layer}.

\begin{figure}[h]
  \centering
  \includegraphics[width=\linewidth]{resources/web_layer}
  \caption{Веб-слой}
  \label{pic:web_layer}
\end{figure}

Если конечный пользователь обладает всеми правами администратора, то ему предоставляется удобный и гибкий способ изменять саму модель данных приложения без его остановки или нарушений в работе, причём целостность данных обеспечивается как на верхнем уровне за счёт валидации полей, так и на уровне СУБД за счёт запрета каскадных удалений и т.~п.
